# -*- coding: utf-8 -*-
"""
@Time    : 2024/8/2 15:34 
@Author  : ZhangShenao 
@File    : 2.基于Session实现登录.py 
@Desc    : 基于Session实现登录

Session的基本原理:
1. 将用户的身份和状态等相关信息保存在服务端,如Redis、MySQL等存储引擎中
2. Session的ID会通过Cookie的方式保存在客户端浏览器本地,Cookie的key一般为sessionid
3. 对于一些对安全性要求较高、或者需要保存敏感数据的场景,更适合使用Session的方式

Flask提供了session对象,可以非常方便地操作Session

因为Flask中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项
"""

import time

from flask import Flask, Response, request, url_for, session

app = Flask(__name__)
app.config["DEBUG"] = True

# 因为Flask中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项
app.config["SECRET_KEY"] = "abcd#1234~"


@app.route("/login", methods=["GET"])
def login() -> [str | Response]:
    """用户登录"""

    # 获取用户名和密码
    user_name = request.args.get("user_name")
    password = request.args.get("password")

    if user_name == "admin" and password == "123456":
        # 登录成功,设置Session
        # Flask提供了session对象,可以非常方便地操作Session
        session["user_name"] = user_name
        session["user_id"] = "123"

        # 跳转到首页
        location = url_for("index")
        response = Response("登录成功,正在跳转首页...", status=302, headers={"Location": location})
        time.sleep(1)
        return response
    else:
        return "用户名或密码错误"


@app.route("/index", methods=["GET"])
def index() -> str:
    """首页"""

    # 从Session中获取用户信息
    user_name = str(session.get("user_name"))
    user_id = str(session.get("user_id"))
    return f"<h1>欢迎回来,{user_name}({user_id})</h1>"


@app.route("/logout", methods=["GET"])
def logout() -> Response:
    """用户退出登录"""

    # 用户退出登录,删除Session
    session.pop("user_name")
    session.pop("user_id")

    response = Response("您已退出，请重新登录", status=200)
    time.sleep(1)
    return response


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
